home *** CD-ROM | disk | FTP | other *** search
/ Compendium Deluxe 1 / LSD Compendium Deluxe 1.iso / a / programming / assembly / fvector.lha / FilledVectors.S < prev    next >
Encoding:
Text File  |  1993-03-28  |  26.9 KB  |  1,131 lines

  1. ùúùúÿÏ×ÿÏ×ÿÏ×ÿÏ×ÿÏ×ÿÏ×ÿÏ×ÿÏ×ÿÏ×wblt: MACRO            ; "wblt" als Macro definieren
  2.  
  3. \@ btst #6,$dff002        ; \@ = Label, das bei jedem Macro-Aufruf einen
  4.    bne.s \@            ; anderen Namen trägt
  5.  
  6.  ENDM
  7.  
  8. Start:
  9.  move.w #$4000,$dff09a        ; Interrupts sperren
  10.  bsr.s init            ; Initialisierung
  11.  bsr DoVector            ; HauptRoutine
  12.  wblt
  13.  move.l 4.w,a6            ; System wieder herholen
  14.  lea gfxname(pc),a1
  15.  jsr -408(a6)
  16.  move.l d0,a1
  17.  move.l 38(a1),$dff080
  18.  move.w d0,$dff088
  19.  jsr -414(a6)
  20.  move.l screen(pc),a1
  21.  move.l #$12000,d0
  22.  jsr -210(a6)
  23.  move.l oldvbi(pc),$6c.w
  24.  move.w intena(pc),d0
  25.  or.w #$8000,d0
  26.  move.w #$7fff,$dff096
  27.  move.w #$83f0,$dff096
  28.  move.w #$7fff,$dff09c
  29.  move.w d0,$dff09a
  30.  moveq #0,d0
  31.  rts
  32.  
  33. init:                ; INITIALISIERUNG
  34.  move.l 4.w,a6
  35.  move.l #$12000,d0
  36.  move.l #$30002,d1
  37.  jsr -198(a6)            ; ChipRAM
  38.  move.l d0,screen        ; er reicht doch?
  39.  lea $dff000,a6            ; Register-Init
  40.  move.w #$7fff,$96(a6)
  41.  move.l #0,$144(a6)
  42.  move.l #copperlist,$80(a6)
  43.  move.w d0,$88(a6)
  44.  move.l #$2c812cc1,$8e(a6)
  45.  move.l #$3800d0,$92(a6)
  46.  move.l #0,$102(a6)
  47.  move.l #0,$108(a6)
  48.  move.w #$3200,$100(a6)
  49.  move.l d0,a0            ; Bildschirm-Seiten
  50.  move.l a0,a1
  51.  add.l #$12000,a1
  52.  move.l d0,pgh
  53.  add.l #$8000,d0
  54.  move.l d0,pgs
  55.  add.l #$8000,d0
  56.  move.l d0,tmpadr
  57.  moveq #0,d0
  58. clrlp:
  59.  move.l d0,(a0)+
  60.  cmp.l a1,a0
  61.  blt.s clrlp
  62.  move.l #rottab+2,rotptr
  63.  move.w rottab(pc),rotcnt
  64.  bsr dorot            ; bei Verwendung eigener Objekte entfernen!
  65.  move.l $6c.w,oldvbi        ; Interrupt-Init
  66.  move.l #vbiserver,$6c.w
  67.  move.w $1c(a6),intena
  68.  move.w #$7fff,$9a(a6)
  69.  move.w #$c020,$9a(a6)        ; Nur VBI erlauben
  70.  move.w #$87c0,$96(a6)
  71.  rts
  72.  
  73. vbiserver:            ; INTERRUPT
  74.  movem.l d0-d7/a0-a6,-(a7)
  75.  lea $dff000,a6
  76.  bsr joy            ; Joystick-Abfrage
  77.  bsr rotob            ; Mutation des Rotations-Körpers (bei Ver-
  78.                                 ; wendung eigener Objekte entfernen!)
  79.  move.w #1,vbi
  80.  move.w #$20,$9c(a6)
  81.  movem.l (a7)+,d0-d7/a0-a6
  82.  rte
  83.  
  84. joy:                ; JOYSTICK
  85.  move.w $dff00c,d0
  86.  btst #1,d0
  87.  bne.s right
  88.  btst #9,d0
  89.  bne.s left
  90. testud:
  91.  move.w d0,d1
  92.  lsr.w d1
  93.  eor.w d1,d0
  94.  btst #0,d0
  95.  bne.s bckw
  96.  btst #8,d0
  97.  bne.w forw
  98.  rts
  99. right:                ; rechts
  100.  btst #7,$bfe001        ; rechts + Feuer ?
  101.  bne.s nfr
  102.  addq.w #6,rzb            ; Feuer -> z-rot + 3°
  103.  cmp.w #720,rzb
  104.  blt.s ok1
  105.  move.w #0,rzb
  106. ok1:
  107.  bra.s testud
  108. nfr:                ; kein Feuer -> y-rot + 3°
  109.  addq.w #6,ryb
  110.  cmp.w #720,ryb
  111.  blt.s ok
  112.  move.w #0,ryb
  113. ok:
  114.  bra.s testud
  115. left:                ; links
  116.  btst #7,$bfe001        ; links + Feuer ?
  117.  bne.s nfrl
  118.  subq.w #6,rzb            ; Feuer -> z-rot - 3°
  119.  bge.s ok11
  120.  add.w #720,rzb
  121. ok11:
  122.  bra.s testud
  123. nfrl:
  124.  subq.w #6,ryb            ; kein Feuer -> y-rot - 3°
  125.  bne.s ok21
  126.  add.w #720,ryb
  127. ok21:
  128.  bra testud
  129. bckw:                ; zurück
  130.  btst #7,$bfe001        ; zurück + Feuer
  131.  bne.s nfr2
  132.  cmp.l #-5000,addzb        ; Feuer -> 1000 Punkte näher ran
  133.  bge.s ok22
  134.  add.l #1000,addzb
  135. ok22:
  136.  rts
  137. nfr2:                ; kein Feuer -> x-rot - 3°
  138.  subq.w #6,rxb
  139.  bge.s ok23
  140.  add.w #720,rxb
  141. ok23:
  142.  rts
  143. forw:                ; vorwärts
  144.  btst #7,$bfe001        ; vorwärts + Feuer
  145.  bne.s nfr3
  146.  cmp.l #-250000,addzb        ; Feuer -> 1000 Punkte weiter weg
  147.  ble.s ok24
  148.  sub.l #1000,addzb
  149. ok24:
  150.  rts
  151. nfr3:                ; kein Feuer -> x-rot + 3°
  152.  addq.w #6,rxb
  153.  cmp.w #720,rxb
  154.  blt.s ok25
  155.  move.w #0,rxb
  156. ok25:
  157.  rts
  158.  
  159. DoVector:            ; HAUPT-ROUTINE
  160.  movem.l d2-d7/a2-a6,-(a7)
  161. vcloop:                ; warten auf VBI
  162.  tst.w vbi
  163.  beq.s vcloop
  164.  move.w #-1,drawnum
  165.  bsr clrscreen            ; Bildlöschen starten
  166.  bsr vector            ; Berechnung und Zeichnung
  167.  move.w #0,vbi
  168.  btst #6,$bfe001        ; Left Mouse Button ?
  169.  bne.s vcloop
  170.  movem.l (a7)+,d2-d7/a2-a6
  171.  rts
  172.  
  173. clrscreen:            ; BILDLÖSCHEN
  174.  movem.l pgh,d0-d1        ; Page Flipping
  175.  move.l d0,pgs            ; für Double Buffering
  176.  move.l d1,pgh
  177.  lea page,a0            ; neue Seiten in CopperList
  178.  move.w d0,6(a0)
  179.  swap d0
  180.  move.w d0,2(a0)
  181.  swap d0
  182.  add.l #148*40,d0
  183.  move.w d0,14(a0)
  184.  swap d0
  185.  move.w d0,10(a0)
  186.  swap d0
  187.  add.l #148*40,d0
  188.  move.w d0,22(a0)
  189.  swap d0
  190.  move.w d0,18(a0)
  191.  movem.l addxb(pc),d0-d4    ; gebufferte Joystickbewegungen
  192.  movem.l d0-d4,addx        ; für gültig erklären.
  193.  move.w #$4000,$9a(a6)        ; Int's sperren (falls Blitter auch im VBI
  194.  wblt                ; gebraucht würde)
  195.  moveq #-1,d0
  196.  move.l d0,$44(a6)
  197.  move.w #0,$66(a6)
  198.  move.l #$1000000,$40(a6)
  199.  move.l pgh(pc),$54(a6)
  200.  move.w #148*3*64+(40/2),$58(a6); Starten des Löschens
  201.  move.w #$c000,$9a(a6)
  202.  rts
  203.  
  204. quicksort:            ; QUICKSORT-Algorithmus
  205.  moveq #0,d4
  206.  move.l #ztab,d5
  207.  lea lrtab(pc),a0
  208.  lea dttab(pc),a1
  209.  move.l d5,0(a0,d4.w)
  210.  move.l zend(pc),a5
  211.  move.l a5,4(a0,d4.w)
  212. l20:
  213.  move.l 0(a0,d4.w),d5
  214.  move.l 4(a0,d4.w),a5
  215.  subq.w #8,d4
  216. l30:
  217.  move.l d5,a2
  218.  move.l a5,a3
  219.  move.l a2,d1
  220.  sub.l #ztab,d1
  221.  move.w d1,d3
  222.  add.w d1,d1
  223.  add.w d3,d1
  224.  asr.w #1,d3
  225.  add.w d3,d1
  226.  move.l a3,d2
  227.  sub.l #ztab,d2
  228.  move.w d2,d3
  229.  add.w d2,d2
  230.  add.w d3,d2
  231.  asr.w #1,d3
  232.  add.w d3,d2
  233.  move.l d5,d0
  234.  add.l a5,d0
  235.  asr.l #3,d0
  236.  asl.l #2,d0
  237.  move.l d0,a6
  238.  move.l (a6),d3
  239. l40:
  240.  cmp.l (a2),d3
  241.  ble.s l41
  242.  addq.l #4,a2
  243.  add.w #14,d1
  244.  bra.s l40
  245. l41:
  246.  cmp.l (a3),d3
  247.  bge.s l42
  248.  subq.l #4,a3
  249.  sub.w #14,d2
  250.  bra.s l41
  251. l42:
  252.  cmp.l a3,a2
  253.  bgt.s l50
  254.  move.l (a3),d0
  255.  move.l (a2),(a3)
  256.  move.l d0,(a2)
  257.  exg.l d0,d5
  258.  movem.l 0(a1,d1.w),d5-d7
  259.  move.l 0(a1,d2.w),0(a1,d1.w)
  260.  move.l 4(a1,d2.w),4(a1,d1.w)
  261.  move.l 8(a1,d2.w),8(a1,d1.w)
  262.  movem.l d5-d7,0(a1,d2.w)
  263.  move.w 12(a1,d1.w),d5
  264.  move.w 12(a1,d2.w),12(a1,d1.w)
  265.  move.w d5,12(a1,d2.w)
  266.  exg.l d0,d5
  267.  addq.l #4,a2
  268.  subq.l #4,a3
  269.  add.w #14,d1
  270.  sub.w #14,d2
  271.  cmp.l a3,a2
  272.  ble.s l40
  273. l50:
  274.  cmp.l a5,a2
  275.  blt.s l52
  276. l51:
  277.  move.l a3,a5
  278.  cmp.l a5,d5
  279.  blt l30
  280.  tst.w d4
  281.  bge l20
  282.  rts
  283. l52:
  284.  addq.w #8,d4
  285.  move.l a2,0(a0,d4.w)
  286.  move.l a5,4(a0,d4.w)
  287.  bra.s l51
  288.  
  289. vector:                ; hier erfolgt die Hauptarbeit
  290.  bsr transform            ; Rotation + 3D-Projektion
  291.  bsr backs            ; Flächenrücken-Überprüfung
  292.  tst.w drawnum            ; keine Fläche zu sehen?
  293.  blt end            ; dann Ende
  294.  bsr quicksort            ; schneller Sortieralgorithmus
  295.  lea dttab(pc),a5        ; Tabelle mit Zeigern auf die sortierten,
  296.  lea $dff000,a6            ; verbleibenden Flächen
  297.  lea hix(pc),a1
  298.  move.w drawnum(pc),d7
  299. lp:
  300.  move.l (a5)+,a3        ; Flächen-Info-Adresse
  301.  move.l 6(a5),a2
  302.  move.w (a3)+,d5        ; Eckenzahl holen
  303.  lea 10(a5),a5            ; Zeiger auf nächste Fläche erhöhen
  304.  subq.w #1,d5
  305.  move.w (a3)+,-(a7)        ; Farbe auf Stack
  306.  moveq #-1,d0
  307.  move.w #640,2(a1)        ; Ausmaße für Füll- und Kopier-Fenster reseten
  308.  move.w d0,(a1)
  309.  move.w #640,6(a1)
  310.  move.w d0,4(a1)
  311.  move.w #0,line
  312.  lea scx1(pc),a4        ; Eintrag in Rechte-Rand-Clip löschen
  313.  move.l d0,(a4)
  314.  move.l d0,4(a4)
  315. linelp:
  316.  move.w (a3)+,d6        ; Eckpunktnummer aus Flächen-Info holen
  317.                                 ; (Startpunkt)
  318.  movem.w 0(a2,d6.w),d0-d1    ; entsprechende 2D-Koordinaten aus ttab holen
  319.  move.w (a3),d6
  320.  movem.w 0(a2,d6.w),d2-d3    ; Endpunkt holen
  321.  asr.w #4,d0            ; wieder durch 16 dividieren
  322.  asr.w #4,d1
  323.  asr.w #4,d2
  324.  asr.w #4,d3
  325.  bsr drawl            ; Clippen + Linie zeichnen
  326.  dbf d5,linelp            ; alle Linien einer Fläche?
  327.  tst.w scx1            ; wurde Eintrag in
  328.  blt.s noclip            ; Rechte-Rand-Clip gemacht?
  329.  tst.w scx2            ; ja -> Clip-Linie zeichnen
  330.  blt.s noclip
  331.  lea scx1(pc),a4
  332.  movem.w (a4),d0-d3
  333.  bsr.s drawl            ; Clip-Linie zeichnen
  334. noclip:                ; kein Rechte-Rand-Clip
  335.  tst.w line            ; gar keine Linie gezeichnet?
  336.  beq.s nodraw
  337.  bsr calcwindow            ; erhaltene Fill-/Copy-Fenster Maße umrechnen
  338.  move.w (a7)+,d4        ; Farbe holen
  339.  bsr copy
  340.  dbf d7,lp            ; alle Flächen?
  341. end:
  342.  rts
  343. nodraw:
  344.  move.w (a7)+,d4        ; Farbe holen
  345.  dbf d7,lp            ; alle Flächen
  346.  rts
  347.  
  348. drawl:                ; LINIE clippen + zeichnen
  349.  movem.l d4-d7/a5-a6,-(a7)
  350.  cmp.w d1,d3            ; weiter unten liegendes Koordinaten-Paar
  351.                  ; nach d2-d3
  352.  bge.s ec
  353.  exg.l d0,d2
  354.  exg.l d1,d3
  355. ec:
  356.  cmp.w 6(a1),d1            ; neues lo-y?
  357.  bge.s lyk
  358.  move.w d1,6(a1)
  359. lyk:
  360.  cmp.w 4(a1),d3            ; neues hi-y?
  361.  ble.s hyk
  362.  move.w d3,4(a1)
  363. hyk:
  364.  move.w d0,d4            ; höheres x nach d5
  365.  move.w d2,d5            ; niederes x nach d4
  366.  cmp.w d4,d5
  367.  bge.s ok13
  368.  exg.l d4,d5            ; d4/d6 ggf. austauschen
  369. ok13:
  370.  cmp.w 2(a1),d4            ; neues lo-x?
  371.  bge.s lxk
  372.  move.w d4,2(a1)
  373. lxk:
  374.  cmp.w (a1),d5            ; neues hi-x?
  375.  ble.s chky
  376.  move.w d5,(a1)
  377. chky:                ; Clipping, rechts zuerst
  378.  move.w #319,d6
  379.  cmp.w d6,d0            ; P1 rechts von rechter Kante
  380.  bgt.s ctx21            ; ja -> x = 319 und neues y
  381.  cmp.w d6,d2            ; P2 rechts von rechter Kante
  382.  bgt.w ctx22            ; ja -> x = 319 und neues y
  383.  moveq #0,d6
  384.  tst.w d1            ; P1 über Oberkante ?
  385.  bmi.s cty11            ; ja -> y = 0 und neues x
  386.  tst.w d3            ; P2 über Oberkante ?
  387.  bmi.s cty12            ; ja -> y = 0 und neues x
  388.  move.w #147,d6
  389.  cmp.w d6,d1            ; P1 unter Unterkante ?
  390.  bgt.s cty21            ; ja -> x = 147 und neues y
  391.  cmp.w d6,d3            ; P2 unter Unterkante ?
  392.  bgt.s cty22            ; ja -> x = 147 und neues y
  393. chkx:
  394.  moveq #0,d6
  395.  tst.w d0            ; P1 links von linker Kante ?
  396.  bmi.s ctx11            ; ja -> x = 0 und neues y
  397.  tst.w d2            ; P2 links von linker Kante ?
  398.  bmi.s ctx12            ; ja -> x = 0 und neues y
  399.  bra dline
  400. cty11:                ; Clip Oberkante
  401.  tst.w d3            ; auch P2 über Oberkante (-> Line unsichtbar) ?
  402.  bmi.s clpend
  403.  bsr.s clipy
  404.  move.w d4,d0            ; berechnete x-Koordinate
  405.  moveq #0,d1            ; y=0
  406.  bra chky            ; noch einmal überprüfen
  407. cty12:
  408.  bsr.s clipy            ; Clip Oberkante
  409.  move.w d4,d2            ; berechnete x-Koordinate
  410.  moveq #0,d3            ; y=0
  411.  bra chky
  412. cty21:                ; Clip Unterkante
  413.  cmp.w d6,d3            ; auch P2 unter Unterkante ?
  414.  bgt.s clpend
  415.  bsr.s clipy
  416.  move.w d4,d0            ; berechnete x-Koordinate
  417.  move.w d6,d1            ; y=147
  418.  bra chky
  419. cty22:                ; Clip Unterkante
  420.  bsr.s clipy
  421.  move.w d4,d2            ; berechnete x-Koordinate
  422.  move.w d6,d3            ; y=147
  423.  bra chky
  424. ctx11:                ; Clip linke Kante
  425.  tst.w d2            ; auch P2 links von linker Kante ?
  426.  bmi.s clpend
  427.  bsr.s clipx
  428.  move.w d4,d1            ; berechnete y-Koordinate
  429.  moveq #0,d0            ; x=0
  430.  bra chky
  431. ctx12:                ; Clip linke Kante
  432.  bsr.s clipx
  433.  move.w d4,d3            ; berechnete y-Koordinate
  434.  moveq #0,d2            ; x=0
  435.  bra chky
  436. ctx21:                ; Clip rechte Kante
  437.  cmp.w d6,d2            ; auch P2 rechts von rechter Kante ?
  438.  bgt.s clpend
  439.  bsr.s clipx
  440.  move.w d4,d1            ; berechnete y-Koordinate
  441.  move.w d6,d0            ; x=319
  442.  movem.w d0-d1,(a4)        ; Schnittpunkt mit rechter Kante merken
  443.  addq.l #4,a4
  444.  bra chky            ; noch einmal überprüfen
  445. ctx22:                ; Clip rechte Kante
  446.  bsr.s clipx
  447.  move.w d4,d3            ; berechnete y-Koordinate
  448.  move.w d6,d2            ; x=319
  449.  movem.w d2-d3,(a4)        ; Schnittpunkt mit rechter Kante merken
  450.  addq.l #4,a4
  451.  bra chky            ; noch einmal überprüfen
  452. clpend:                ; Linie unsichtbar
  453.  movem.l (a7)+,d4-d7/a5-a6
  454.  rts
  455. clipy:                ; yb bekannt (Unter-/Oberkante)
  456.  move.w d0,d4            ; xn berechnen
  457.  sub.w d2,d4            ; x' = x1-x2
  458.  move.w d3,d5
  459.  move.w d3,d7
  460.  sub.w d6,d7            ; y' = y2-yb
  461.  muls d7,d4            ; xn = x' * y'
  462.  sub.w d1,d5
  463.  divs d5,d4            ; xn = xn / (y2-y1)
  464.  add.w d2,d4            ; xn = xn + x2
  465.  rts
  466. clipx:                ; xb bekannt (Linke/Rechte Kante)
  467.  move.w d1,d4            ; yn berechnen
  468.  sub.w d3,d4            ; y' = y1-y2
  469.  move.w d2,d5
  470.  move.w d2,d7
  471.  sub.w d6,d7            ; x' = x2-xb
  472.  muls d7,d4            ; yn = x' * y'
  473.  sub.w d0,d5
  474.  divs d5,d4            ; yn = yn / (x2-x1)
  475.  add.w d3,d4            ; yn = yn + y2
  476.  rts
  477.  
  478. dline:                ; Hier wird gezeichnet
  479.  cmp.w d1,d3            ; Falls y1 = y2 -> Keine Linie,
  480.  beq drawend            ; da Blitter im Single-Mode
  481.  move.w d1,d5
  482.  move.w d1,d4
  483.  asl.w #5,d5
  484.  asl.w #3,d4
  485.  add.w d4,d5
  486.  move.l tmpadr(pc),a5        ; In Hilfs-Ebene zeichnen
  487.  lea 0(a5,d5.w),a5
  488.  move.w d0,d4
  489.  asr.w #4,d4
  490.  add.w d4,d4
  491.  lea 0(a5,d4.w),a5        ; Adresse für Prozessor-EOR
  492.  sub.w d0,d2
  493.  sub.w d1,d3
  494.  moveq #15,d5
  495.  and.l d5,d0
  496.  move.w d0,d4
  497.  ror.l #4,d0
  498.  eor.w d5,d4
  499.  moveq #0,d5
  500.  bset d4,d5            ; Genaues Bit für Prozessor-EOR
  501.  move.w #4,d0
  502.  tst.w d2
  503.  bpl.s d2g0
  504.  addq.w #1,d0
  505.  neg.w d2
  506. d2g0:
  507.  cmp.w d2,d3
  508.  ble.s d2gd3
  509.  exg.l d2,d3
  510.  subq.w #4,d0
  511.  add.w d0,d0
  512. d2gd3:
  513.  move.w d3,d4
  514.  sub.w d2,d4
  515.  add.w d4,d4
  516.  add.w d4,d4
  517.  add.w d3,d3
  518.  moveq #0,d6
  519.  move.w d3,d6
  520.  sub.w d2,d6
  521.  bpl.s d6gd2
  522.  or.w #16,d0
  523. d6gd2:
  524.  add.w d3,d3
  525.  add.w d0,d0
  526.  add.w d0,d0
  527.  addq.w #1,d2
  528.  asl.w #6,d2
  529.  addq.w #2,d2
  530.  swap d3
  531.  move.w d4,d3
  532.  or.l #$b4a0003,d0        ; EOR-MiniTerms + SING-Bit + Line-Bit
  533.  move.w #$4000,$9a(a6)        ; Interrupts wegen Blitter sperren (falls
  534.  wblt                ; im VBI Blitterzugriff erfolgt)
  535.  moveq #40,d1            ; Register für Line initialisieren
  536.  move.w d1,$60(a6)
  537.  move.w d1,$66(a6)
  538.  moveq #-1,d1
  539.  move.l d1,$44(a6)
  540.  move.w d1,$72(a6)
  541.  move.w #$8000,$74(a6)
  542.  eor.w d5,(a5)            ; Prozessor-EOR
  543.  move.l d3,$62(a6)
  544.  move.l a5,$48(a6)
  545.  move.l a5,$54(a6)
  546.  move.w d6,$52(a6)
  547.  move.l d0,$40(a6)
  548.  move.w d2,$58(a6)
  549.  move.w #$c000,$9a(a6)        ; Interrupts wieder freigeben
  550.  add.w #1,line
  551. drawend:
  552.  movem.l (a7)+,d4-d7/a5-a6
  553.  rts
  554.  
  555. calcwindow:            ; GRÖSSE des Fill-/Copy- Fensters
  556.  cmp.w #319,(a1)        ; in Adressen u. Modulo umrechnen
  557.  ble.s ok14
  558.  move.w #319,(a1)        ; Überprüfung auf Rand-Überschreitung
  559.  ok14:
  560.   tst 2(a1)
  561.   bge.s ok15            ; ...
  562.   move.w #0,2(a1)
  563.  ok15:
  564.   cmp.w #147,4(a1)
  565.   ble.s ok16
  566.   move.w #147,4(a1)
  567.  ok16:
  568.   tst.w 6(a1)
  569.   bge.s ok17
  570.   move.w #0,6(a1)
  571.  ok17:
  572.   move.w (a1),d0
  573.   asr.w #4,d0            ; x-Offset des Blitterfensters
  574.   asl.w #1,d0
  575.   move.w d0,woffx
  576.   asr.w #1,d0
  577.   move.w 2(a1),d1
  578.   asr.w #4,d1
  579.   sub.w d1,d0            ; x-Größe des Blitterfensters
  580.   addq.w #1,d0
  581.   move.w d0,wsizex
  582.   asl.w #1,d0
  583.   moveq #40,d1            ; Modulo
  584.   sub.w d0,d1            ; für temporäre
  585.   move.w d1,tmpmod        ; Hilfsebene
  586.   move.w 4(a1),d0
  587.   sub.w 6(a1),d0        ; y-Ausdehnung des Blitterfensters
  588.   addq.w #1,d0
  589.   move.w d0,wsizey
  590.   move.w 4(a1),d0
  591.   move.w d0,d1
  592.   asl.w #3,d0
  593.   asl.w #5,d1            ; y-Offset des Blitterfensters
  594.   add.w d1,d0
  595.   move.w d0,woffy
  596.   rts
  597.  
  598. transform:            ; TRANSFORMATION
  599.  lea objpd(pc),a2        ; 3D-Eckpunkt-Daten
  600.  lea ttab(pc),a3        ; Tabelle für 2D-Ergebnis-Daten
  601.  lea sintab(pc),a0        ; Zeiger auf Sinus-Tabelle
  602.  lea costab(pc),a1        ; Zeiger auf Cosinus-Tabelle
  603.  lea z2tab(pc),a4        ; Zwischen-Tabelle für 3D-Z-Koords der
  604.  moveq #15,d6            ; einzelnen Punkte
  605.  move.w (a2)+,d5
  606.  subq.w #1,d5            ; Eckenzahl - 1
  607. translp:
  608.  movem.w (a2)+,d0-d2        ; 3D-Koordinaten holen
  609.  asl.w #4,d0            ; Zwecks höherer Genauigkeit der
  610.  asl.w #4,d1            ; Rechnungen, Multiplikation mit 16
  611.  asl.w #4,d2
  612.  move.w rx(pc),d3        ; Rotation um x-Achse
  613.  move.w d1,d4
  614.  move.w d2,d7
  615.  muls 0(a1,d3.w),d1
  616.  muls 0(a0,d3.w),d2
  617.  sub.l d2,d1
  618.  asr.l d6,d1
  619.  muls 0(a0,d3.w),d4
  620.  muls 0(a1,d3.w),d7
  621.  add.l d7,d4
  622.  asr.l d6,d4
  623.  move.w d4,d2
  624.  move.w ry(pc),d3        ; Rotation um y-Achse
  625.  move.w d0,d4
  626.  move.w d2,d7
  627.  muls 0(a1,d3.w),d0
  628.  muls 0(a0,d3.w),d2
  629.  add.l d2,d0
  630.  asr.l d6,d0
  631.  neg.w d4
  632.  muls 0(a0,d3.w),d4
  633.  muls 0(a1,d3.w),d7
  634.  add.l d7,d4
  635.  asr.l d6,d4
  636.  move.w d4,d2
  637.  move.w rz(pc),d3        ; Rotation um z-Achse
  638.  move.w d0,d4
  639.  move.w d1,d7
  640.  muls 0(a1,d3.w),d0
  641.  muls 0(a0,d3.w),d1
  642.  sub.l d1,d0
  643.  asr.l d6,d0
  644.  muls 0(a0,d3.w),d4
  645.  muls 0(a1,d3.w),d7
  646.  add.l d7,d4
  647.  asr.l d6,d4
  648.  move.w d4,d1
  649.  move.w d2,(a4)+        ; z-Koordinate jedes einzelnen Echpunktes
  650.  ext.l d0            ; nach Zwischentabelle
  651.  ext.l d1
  652.  ext.l d2
  653.  add.l addx(pc),d0        ; Verschiebung addieren
  654.  add.l addy(pc),d1
  655.  add.l addz(pc),d2
  656.  beq.s ptjend
  657.  moveq #10,d3            ; Strahlensatz:
  658.  asl.l d3,d0            ;      f*x
  659.  asl.l d3,d1            ; x' = -
  660.  asr.l #3,d2            ;       z
  661.  divs d2,d0
  662.  divs d2,d1            ;        f*y
  663.  neg.w d0            ; y' = - -
  664.  add.w #160*16,d0        ;         z
  665.  add.w #74*16,d1        ; Zentrieren
  666. ptjend:
  667.  movem.w d0-d1,(a3)        ; und nach 2D-Tabelle speichern
  668.  addq.l #4,a3
  669.  dbf d5,translp
  670.  rts
  671.  
  672. backs:                ; FLÄCHENRÜCKEN-Überprüfung
  673.  lea objad(pc),a2
  674.  lea ttab(pc),a3
  675.  lea z2tab(pc),a1
  676.  lea ztab(pc),a0
  677.  lea dttab(pc),a4
  678.  move.w (a2)+,d7
  679.  subq.w #1,d7
  680. backslp:
  681.  move.w 4(a2),d5
  682.  movem.w 0(a3,d5.w),d0-d1    ; 2D-Koordinaten der drei ersten Punkte
  683.  move.w 6(a2),d5        ; (im Text D, E, F, genannt)
  684.  movem.w 0(a3,d5.w),d2-d3
  685.  move.w 8(a2),d5
  686.  movem.w 0(a3,d5.w),d4-d5
  687.  sub.w d0,d2            ; Daraus Vektoren
  688.  sub.w d1,d3            ; v
  689.  sub.w d0,d4            ; und
  690.  sub.w d1,d5            ; w berechnen
  691.  muls d2,d5            ; Multiplikation f+r
  692.  muls d3,d4            ; Vektorprodukt
  693.  sub.l d4,d5            ; und Subtraktion dazu
  694.  bmi.s notvisib            ; <0 -> nix sichtbar
  695.  move.w (a2),d6
  696.  subq.w #1,d6
  697.  moveq #4,d5
  698.  moveq #0,d1
  699. avlp:
  700.  move.w 0(a2,d5.w),d0        ; Addition der z-Koordinaten
  701.  asr.w #1,d0            ; der Eckpunkte aus der
  702.  add.w 0(a1,d0.w),d1        ; Zwischen-Tabelle ...
  703.  addq.w #2,d5
  704.  dbf d6,avlp
  705.  addq.w #1,drawnum
  706.  ext.l d1
  707.  divs (a2),d1            ; ... Division durch Anzahl der Eckpunkte
  708.  ext.l d1            ; zur Durchschnittsberechnung
  709.  add.l addz(pc),d1
  710.  move.l d1,(a0)+        ; In ztab zum Sortieren speichern.
  711.  move.l a2,(a4)+        ; Eintrag für sichtbare Fläche
  712.  addq.l #6,a4            ; in dttab anlegen (Zeiger auf
  713.  move.l a3,(a4)+        ; objad-Eintrag, ...)
  714. notvisib:
  715.  lea 22(a2),a2
  716.  dbf d7,backslp            ; alle Flächen?
  717.  subq.l #4,a0
  718.  move.l a0,zend            ; Ende von ztab (für Quicksort)
  719.  rts
  720.  
  721. copy:                ; FÜLLEN der Fläche in Hilfsebene
  722.  move.l tmpadr(pc),a0        ; + KOPIEREN in Hauptscreen
  723.  move.l pgh(pc),a1        ; + LÖSCHEN der Hilfsebene
  724.  moveq #0,d2
  725.  move.w woffx(pc),d2        ; berechnete Window-Werte holen
  726.  add.w woffy(pc),d2
  727.  add.l d2,a0
  728.  add.l d2,a1
  729.  move.w wsizey(pc),d2
  730.  asl.w #6,d2
  731.  add.w wsizex(pc),d2
  732.  move.w tmpmod(pc),d0
  733.  moveq #-1,d1
  734.  move.w #$4000,$9a(a6)
  735.  wblt
  736.  move.w d0,$62(a6)
  737.  move.w d0,$64(a6)
  738.  move.w d0,$66(a6)
  739.  move.l d1,$44(a6)
  740.  move.l a0,$50(a6)
  741.  move.l a0,$54(a6)
  742.  move.l #$9f00012,$40(a6)
  743.  move.w d2,$58(a6)        ; Füllen
  744.  move.l #$dfc0002,d1
  745.  moveq #0,d0
  746.  move.l #$f00000,d3        ; Wechseln für
  747. copylp:                ; löschend oder
  748.  btst d0,d4            ; setzend kopieren
  749.  bne.s ok18
  750.  sub.l d3,d1
  751. ok18:
  752.  wblt
  753.  move.l d1,$40(a6)
  754.  move.l a0,$50(a6)
  755.  move.l a1,$4c(a6)
  756.  move.l a1,$54(a6)
  757.  move.w d2,$58(a6)        ; Nach Farb-Wert in die
  758.  or.l d3,d1            ; drei Ebenen kopieren
  759.  lea 148*40(a1),a1
  760.  addq.w #1,d0
  761.  cmp.w #2,d0
  762.  ble.s copylp            ; Alle drei Ebenen?
  763.  wblt
  764.  move.l #$1000002,$40(a6)
  765.  move.l a0,$54(a6)
  766.  move.w d2,$58(a6)        ; Fläche in Hilfsebene
  767.  move.w #$c000,$9a(a6)        ; wieder löschen
  768.  rts
  769.  
  770. rotob:                ; BEARBEITUNG von "rottab"
  771.  subq.w #1,animcnt
  772.  bge.s endrot            ; Nur jeden dritten Aufruf
  773.  move.w #2,animcnt        ; abarbeiten
  774.  lea objpd(pc),a2
  775.  move.l rotptr(pc),a3
  776.  moveq #5,d6            ; sechs Einschnitte
  777. rotlp:
  778.  move.w 2(a2),d0
  779.  cmp.w (a3),d0            ; vorgegebenes x erreicht?
  780.  beq.s okx
  781.  blt.s lowx
  782.  subq.w #2,2(a2)        ; noch zu groß ->
  783.  bra.s okx            ; Verringerung um 8
  784. lowx:
  785.  addq.w #8,2(a2)        ; noch zu klein ->
  786. okx:                ; Vergrößerung um 8
  787.  move.w 4(a2),d0
  788.  cmp.w 2(a3),d0            ; vorgegebenes y erreicht?
  789.  beq.s oky
  790.  blt.s lowy
  791.  subq.w #8,4(a2)        ; noch zu groß ->
  792.  bra.s oky            ; Verringerung um 8
  793. lowy:
  794.  addq.w #8,4(a2)        ; noch zu klein ->
  795. oky:                ; Vergrößerung um 8
  796.  lea 8*6(a2),a2
  797.  addq.l #4,a3
  798.  dbf d6,rotlp
  799.  subq.w #1,rotcnt
  800.  bgt.s ok30            ; Darstellungszeit zu ende?
  801.  tst.w (a3)
  802.  bge.s ok20            ; "rottab" zu ende?
  803.  lea rottab(pc),a3
  804. ok20:
  805.  move.w (a3)+,rotcnt
  806.  move.l a3,rotptr
  807. ok30:
  808.  bsr.s dorot
  809. endrot
  810.  rts
  811.  
  812. dorot:                ; ermittelte Kontur des
  813.  lea sintab(pc),a0        ; Körpers dreidimensionalisieren
  814.  lea costab(pc),a1
  815.  lea objpd(pc),a2
  816.  moveq #5,d6            ; sechs Einschnitte
  817.  moveq #15,d7
  818.  addq.l #2,a2
  819. roto:
  820.  moveq #7,d5            ; Kreis in acht Abschnitte a 45°
  821.  moveq #0,d4            ; zerteilen
  822.  move.w (a2),d3            ; x-Koordinate
  823.  move.w 2(a2),d1        ; und y-Koordinate des Kontur-
  824. roti:                ; Einschnittes holen (y nur für movem)
  825.  move.w d3,d0
  826.  move.w d3,d2
  827.  muls 0(a1,d4.w),d0        ; x mit cos multiplizieren -> neu_x
  828.  muls 0(a0,d4.w),d2        ; x mit sin multiplizieren -> neu_z
  829.  asr.l d7,d0
  830.  asr.l d7,d2
  831.  movem d0-d2,(a2)        ; als 3D-Koords in "objpd" speichern
  832.  addq.l #6,a2
  833.  add.w #90,d4
  834.  dbf d5,roti
  835.  dbf d6,roto
  836.  rts
  837.  
  838. tmpadr dc.l 0
  839. screen dc.l 0
  840. vbi dc.w 0
  841. pgh dc.l 0             ; ******
  842. pgs dc.l 0
  843. addx dc.l 0            ; WICHTIG!!
  844. addy dc.l 0
  845. addz dc.l 0            ; Diese
  846. rx dc.w 0
  847. ry dc.w 0            ; Konstellation
  848. rz dc.w 0
  849.    dc.w 0            ; darf
  850. hix dc.w 0
  851. lox dc.w 0            ; unter
  852. hiy dc.w 0
  853. loy dc.w 0            ; keinen
  854. addxb dc.l 0
  855. addyb dc.l 0            ; Umständen
  856. addzb dc.l -25000    ; (Start-Z)
  857. rxb dc.w 0            ; geändert
  858. ryb dc.w 0
  859. rzb dc.w 0            ; werden
  860. scx1 dc.w 0            ; !!
  861. scy1 dc.w 0            ; !!
  862. scx2 dc.w 0            ; !!
  863. scy2 dc.w 0            ; ******
  864. zend dc.l 0
  865. wsizex dc.w 1
  866. wsizey dc.w 1
  867. woffx dc.w 0
  868. woffy dc.w 0
  869. tmpmod dc.w 0
  870. drawnum dc.w 0
  871. line dc.w 0
  872. animcnt dc.w 0
  873. oldvbi dc.l 0
  874. intena dc.w 0
  875. rotcnt dc.w 0
  876. rotptr dc.l 0
  877.  
  878. ttab:                ; Tabelle für 2D-Koordinaten
  879.  dcb.w 50*2
  880.  
  881. z2tab:                ; Zwischen-Tabelle für z-Koords jedes Punktes
  882.  dcb.w 50
  883.  cnop 0,4
  884.  
  885. ztab:                ; z-Koordinaten-Tabelle für Flächendurch-
  886.  dcb.l 50            ; schnitt (Sortieren)
  887.  
  888. dttab:                ; Tabelle mit Einträgen der sichtbaren Flächen
  889.  dcb.w 50*7
  890.  
  891. lrtab:                ; Hilfs-Tabelle für Quicksort
  892.  dcb.l 50
  893.  
  894. rottab:                ; Tabelle für Mutation des Körpers
  895.  dc.w 30            ; Dauer der Darstellung dieser Mutation
  896.  dc.w -$a*3,$40*3        ; x, y-Ziel für ersten Einschnitt
  897.  dc.w -$14*3,$28*3        ; x, y-Ziel für zweiten Einschnitt
  898.  dc.w -$40*3,$8*3        ; x, y-Ziel für dritten Einschnitt
  899.  dc.w -$40*3,-$8*3        ; x, y-Ziel für vierten Einschnitt
  900.  dc.w -$14*3,-$28*3        ; x, y-Ziel für fünften Einschnitt
  901.  dc.w -$a*3,-$40*3        ; x, y-Ziel für sechsten Einschnitt
  902.  dc.w 30            ; Dauer der Darstellung der nächsten Mutation
  903.  dc.w -$3a*3,$40*3
  904.  dc.w -$24*3,$20*3
  905.  dc.w -$10*3,$20*3
  906.  dc.w -$10*3,-$20*3
  907.  dc.w -$24*3,-$20*3
  908.  dc.w -$3a*3,-$40*3
  909.  dc.w 30
  910.  dc.w -$a*3,$40*3
  911.  dc.w -$34*3,$20*3
  912.  dc.w -$10*3,$20*3
  913.  dc.w -$10*3,-$20*3
  914.  dc.w -$34*3,-$20*3
  915.  dc.w -$a*3,-$40*3
  916.  dc.w 30
  917.  dc.w -$a*3,$28*3
  918.  dc.w -$34*3,$8*3
  919.  dc.w -$10*3,$8*3
  920.  dc.w -$10*3,-$8*3
  921.  dc.w -$34*3,-$8*3
  922.  dc.w -$a*3,-$28*3
  923.  dc.w 30
  924.  dc.w -$a*3,$40*3
  925.  dc.w -$14*3,$8*3
  926.  dc.w -$40*3,$8*3
  927.  dc.w -$40*3,-$8*3
  928.  dc.w -$14*3,-$8*3
  929.  dc.w -$a*3,-$40*3
  930.  dc.w 30
  931.  dc.w -$a*3,$40*3
  932.  dc.w -$3c*3,$28*3
  933.  dc.w -$50*3,$10*3
  934.  dc.w -$50*3,-$10*3
  935.  dc.w -$3c*3,-$28*3
  936.  dc.w -$a*3,-$40*3
  937.  dc.w 30
  938.  dc.w -$a*3,$8*3
  939.  dc.w -$3c*3,$28*3
  940.  dc.w -$50*3,$10*3
  941.  dc.w -$50*3,-$10*3
  942.  dc.w -$3c*3,-$28*3
  943.  dc.w -$a*3,-$8*3
  944.  dc.w 50
  945.  dc.w -$a*3,$40*3
  946.  dc.w -$24*3,$30*3
  947.  dc.w -$40*3,-$8*3
  948.  dc.w -$10*3,-$10*3
  949.  dc.w -$24*3,-$20*3
  950.  dc.w -$a*3,-$40*3
  951.  dc.w 50
  952.  dc.w -$a*3,$40*3
  953.  dc.w -$24*3,$20*3
  954.  dc.w -$8*3,-$10*3
  955.  dc.w -$20*3,-$10*3
  956.  dc.w -$24*3,-$20*3
  957.  dc.w -$a*3,-$40*3
  958.  dc.w 50
  959.  dc.w -$3a*3,$40*3
  960.  dc.w -$24*3,$20*3
  961.  dc.w -$20*3,$10*3
  962.  dc.w -$8*3,$10*3
  963.  dc.w -$c*3,-$20*3
  964.  dc.w -$3a*3,-$40*3
  965.  dc.w 50
  966.  dc.w -$a*3,$10*3
  967.  dc.w -$3c*3,$40*3
  968.  dc.w -$20*3,$10*3
  969.  dc.w -$8*3,$10*3
  970.  dc.w -$c*3,-$30*3
  971.  dc.w -$32*3,-$40*3
  972.  dc.w 50
  973.  dc.w -$a*3,$40*3
  974.  dc.w -$44*3,$20*3
  975.  dc.w -$8*3,$20*3
  976.  dc.w -$20*3,-$10*3
  977.  dc.w -$c*3,-$20*3
  978.  dc.w -$a*3,-$40*3
  979.  dc.w -1
  980.  
  981. objpd:                ; Eckpunkt-Tabelle
  982.  dc.w 6*8            ; Anzahl Eckpunkte
  983.  dc.w -$a*3,$40*3,0        ; x,y,z
  984.  dcb.w 7*3            ; sieben leer-x,y,z; werden von "dorot"
  985.  dc.w -$14*3,$28*3,0        ; beschrieben
  986.  dcb.w 7*3
  987.  dc.w -$40*3,$8*3,0
  988.  dcb.w 7*3
  989.  dc.w -$40*3,-$8*3,0
  990.  dcb.w 7*3
  991.  dc.w -$14*3,-$28*3,0
  992.  dcb.w 7*3
  993.  dc.w -$a*3,-$40*3,0
  994.  dcb.w 7*3
  995.  
  996. objad:        ; Flächen-Tabelle: Eckenzahl,Farbe, 9 mal Platz für Punkte
  997.  dc.w 2+8+8+8+8+8 ; Anzahl der Flächen
  998.  dc.w 8,7,0*4,1*4,2*4,3*4,4*4,5*4,6*4,7*4,0*4
  999.  dc.w 8,7,47*4,46*4,45*4,44*4,43*4,42*4,41*4,40*4,47*4
  1000.  
  1001.  dc.w 4,3,40*4,41*4,33*4,32*4,40*4,0,0,0,0
  1002.  dc.w 4,4,41*4,42*4,34*4,33*4,41*4,0,0,0,0
  1003.  dc.w 4,3,42*4,43*4,35*4,34*4,42*4,0,0,0,0
  1004.  dc.w 4,4,43*4,44*4,36*4,35*4,43*4,0,0,0,0
  1005.  dc.w 4,3,44*4,45*4,37*4,36*4,44*4,0,0,0,0
  1006.  dc.w 4,4,45*4,46*4,38*4,37*4,45*4,0,0,0,0
  1007.  dc.w 4,3,46*4,47*4,39*4,38*4,46*4,0,0,0,0
  1008.  dc.w 4,4,47*4,40*4,32*4,39*4,47*4,0,0,0,0
  1009.  
  1010.  dc.w 4,3,8*4,9*4,1*4,0*4,8*4,0,0,0,0
  1011.  dc.w 4,4,9*4,10*4,2*4,1*4,9*4,0,0,0,0
  1012.  dc.w 4,3,10*4,11*4,3*4,2*4,10*4,0,0,0,0
  1013.  dc.w 4,4,11*4,12*4,4*4,3*4,11*4,0,0,0,0
  1014.  dc.w 4,3,12*4,13*4,5*4,4*4,12*4,0,0,0,0
  1015.  dc.w 4,4,13*4,14*4,6*4,5*4,13*4,0,0,0,0
  1016.  dc.w 4,3,14*4,15*4,7*4,6*4,14*4,0,0,0,0
  1017.  dc.w 4,4,15*4,8*4,0*4,7*4,15*4,0,0,0,0
  1018.  
  1019.  dc.w 4,2,16*4,17*4,9*4,8*4,16*4,0,0,0,0
  1020.  dc.w 4,1,17*4,18*4,10*4,9*4,17*4,0,0,0,0
  1021.  dc.w 4,2,18*4,19*4,11*4,10*4,18*4,0,0,0,0
  1022.  dc.w 4,1,19*4,20*4,12*4,11*4,19*4,0,0,0,0
  1023.  dc.w 4,2,20*4,21*4,13*4,12*4,20*4,0,0,0,0
  1024.  dc.w 4,1,21*4,22*4,14*4,13*4,21*4,0,0,0,0
  1025.  dc.w 4,2,22*4,23*4,15*4,14*4,22*4,0,0,0,0
  1026.  dc.w 4,1,23*4,16*4,8*4,15*4,23*4,0,0,0,0
  1027.  
  1028.  dc.w 4,5,24*4,25*4,17*4,16*4,24*4,0,0,0,0
  1029.  dc.w 4,6,25*4,26*4,18*4,17*4,25*4,0,0,0,0
  1030.  dc.w 4,5,26*4,27*4,19*4,18*4,26*4,0,0,0,0
  1031.  dc.w 4,6,27*4,28*4,20*4,19*4,27*4,0,0,0,0
  1032.  dc.w 4,5,28*4,29*4,21*4,20*4,28*4,0,0,0,0
  1033.  dc.w 4,6,29*4,30*4,22*4,21*4,29*4,0,0,0,0
  1034.  dc.w 4,5,30*4,31*4,23*4,22*4,30*4,0,0,0,0
  1035.  dc.w 4,6,31*4,24*4,16*4,23*4,31*4,0,0,0,0
  1036.  
  1037.  dc.w 4,2,32*4,33*4,25*4,24*4,32*4,0,0,0,0
  1038.  dc.w 4,1,33*4,34*4,26*4,25*4,33*4,0,0,0,0
  1039.  dc.w 4,2,34*4,35*4,27*4,26*4,34*4,0,0,0,0
  1040.  dc.w 4,1,35*4,36*4,28*4,27*4,35*4,0,0,0,0
  1041.  dc.w 4,2,36*4,37*4,29*4,28*4,36*4,0,0,0,0
  1042.  dc.w 4,1,37*4,38*4,30*4,29*4,37*4,0,0,0,0
  1043.  dc.w 4,2,38*4,39*4,31*4,30*4,38*4,0,0,0,0
  1044.  dc.w 4,1,39*4,32*4,24*4,31*4,39*4,0,0,0,0
  1045.  
  1046. ; Neue Sinus/Cosinus-Tabelle:
  1047. ; -$8000 bis $7fff
  1048.  
  1049. sintab DC.W 0,$23B,$477,$6B2,$8ED,$B27,$D61,$F99
  1050.        DC.W $11D0,$1405,$1639,$186C,$1A9C,$1CCA,$1EF7,$2120
  1051.        DC.W $2347,$256C,$278D,$29AB,$2BC6,$2DDE,$2FF2,$3203
  1052.        DC.W $340F,$3617,$381C,$3A1B,$3C17,$3E0D,$3FFF,$41EC
  1053.        DC.W $43D3,$45B6,$4793,$496A,$4B3B,$4D07,$4ECD,$508C
  1054.        DC.W $5246,$53F9,$55A5,$574B,$58E9,$5A81,$5C12,$5D9C
  1055.        DC.W $5F1E,$6099,$620C,$6378,$64DC,$6638,$678D,$68D9
  1056.        DC.W $6A1D,$6B58,$6C8C,$6DB6,$6ED9,$6FF2,$7103,$720B
  1057.        DC.W $730A,$7400,$74EE,$75D2,$76AD,$777E,$7846,$7905
  1058.        DC.W $79BB,$7A67,$7B09,$7BA2,$7C31,$7CB7,$7D32,$7DA4
  1059.        DC.W $7E0D,$7E6B,$7EC0,$7F0A,$7F4B,$7F82,$7FAF,$7FD2
  1060.        DC.W $7FEB,$7FFA
  1061. costab DC.W $7FFF,$7FFA,$7FEB,$7FD2,$7FAF,$7F82
  1062.        DC.W $7F4B,$7F0A,$7EC0,$7E6B,$7E0D,$7DA4,$7D32,$7CB7
  1063.        DC.W $7C31,$7BA2,$7B09,$7A67,$79BB,$7905,$7846,$777E
  1064.        DC.W $76AD,$75D2,$74EE,$7400,$730A,$720B,$7103,$6FF2
  1065.        DC.W $6ED9,$6DB6,$6C8B,$6B58,$6A1D,$68D9,$678D,$6638
  1066.        DC.W $64DC,$6378,$620C,$6099,$5F1E,$5D9C,$5C12,$5A81
  1067.        DC.W $58E9,$574B,$55A5,$5EF9,$5246,$508C,$4ECD,$4D07
  1068.        DC.W $4B3B,$496A,$4793,$45B6,$43D3,$41EC,$3FFF,$3E0D
  1069.        DC.W $3C17,$3A1B,$381C,$3618,$340F,$3203,$2FF2,$2DDE
  1070.        DC.W $2BC7,$29AB,$278D,$256C,$2347,$2120,$1EF7,$1CCB
  1071.        DC.W $1A9C,$186C,$163A,$1406,$11D0,$F99,$D61,$B27
  1072.        DC.W $8ED,$6B3,$477,$23C,0,$FDC5,$FB89,$F94E
  1073.        DC.W $F713,$F4D9,$F2A0,$F067,$EE30,$EBFB,$E9C7,$E794
  1074.        DC.W $E564,$E336,$E10A,$DEE0,$DCB9,$DA95,$D873,$D655
  1075.        DC.W $D43A,$D222,$D00E,$CDFE,$CBF1,$C9E9,$C7E5,$C5E5
  1076.        DC.W $C3EA,$C1F3,$C001,$BE14,$BC2D,$BA4B,$B86E,$B696
  1077.        DC.W $B4C5,$B2F9,$B133,$AF74,$ADBB,$AC08,$AA5B,$A8B6
  1078.        DC.W $A717,$A57F,$A3EE,$A264,$A0E2,$9F67,$9DF4,$9C88
  1079.        DC.W $9B24,$99C8,$9874,$9728,$95E4,$94A8,$9375,$924A
  1080.        DC.W $9128,$900E,$8EFD,$8DF5,$8CF6,$8C00,$8B13,$8A2E
  1081.        DC.W $8954,$8882,$87BA,$86FB,$8645,$8599,$84F7,$845E
  1082.        DC.W $83CF,$8349,$82CE,$825C,$81FE,$8195,$8140,$80F6
  1083.        DC.W $80B5,$807E,$8051,$802E,$8015,$8006,$8001,$8006
  1084.        DC.W $8015,$802E,$8051,$807E,$80B5,$80F6,$8140,$8195
  1085.        DC.W $81F3,$825B,$82CD,$8349,$83CF,$845E,$84F7,$8599
  1086.        DC.W $8645,$86FB,$87B9,$8882,$8953,$8A2E,$8B12,$8BFF
  1087.        DC.W $8CF5,$8DF5,$8EFD,$900E,$9127,$9249,$9374,$94A7
  1088.        DC.W $95E3,$9727,$9873,$99C7,$9B23,$9C87,$9DF3,$9F67
  1089.        DC.W $A0E1,$A264,$A3ED,$A57E,$A716,$A8B5,$AA5B,$AC07
  1090.        DC.W $ADBA,$AF73,$B133,$B2F8,$B4C4,$B696,$B86D,$BA4A
  1091.        DC.W $BC2C,$BE14,$C000,$C1F2,$C3E9,$C5E4,$C7E4,$C9E8
  1092.        DC.W $CBF0,$CDFD,$D00D,$D221,$D439,$D654,$D872,$DA94
  1093.        DC.W $DCB8,$DEDF,$E109,$E335,$E563,$E794,$E9C6,$EBFA
  1094.        DC.W $EE30,$F066,$F29F,$F4D8,$F712,$F49D,$FB88,$FDC4
  1095. sinend DC.W 0,$23B,$477,$6B2,$8ED,$B27,$D61,$F99
  1096.        DC.W $11D0,$1405,$1639,$186C,$1A9C,$1CCA,$1EF7,$2120
  1097.        DC.W $2347,$256C,$278D,$29AB,$2BC6,$2DDE,$2FF2,$3203
  1098.        DC.W $340F,$3617,$381C,$3A1B,$3C17,$3E0D,$3FFF,$41EC
  1099.        DC.W $43D3,$45B6,$4793,$496A,$4B3B,$4D07,$4ECD,$508C
  1100.        DC.W $5246,$53F9,$55A5,$574B,$58E9,$5A81,$5C12,$5D9C
  1101.        DC.W $5F1E,$6099,$620C,$6378,$64DC,$6638,$678D,$68D9
  1102.        DC.W $6A1D,$6B58,$6C8C,$6DB6,$6ED9,$6FF2,$7103,$720B
  1103.        DC.W $730A,$7400,$74EE,$75D2,$76AD,$777E,$7846,$7905
  1104.        DC.W $79BB,$7A67,$7B09,$7BA2,$7C31,$7CB7,$7D32,$7DA4
  1105.        DC.W $7E0D,$7E6B,$7EC0,$7F0A,$7F4B,$7F82,$7FAF,$7FD2
  1106.        DC.W $7FEB,$7FFA
  1107. cosend
  1108.  
  1109. gfxname dc.b "graphics.library",0
  1110.  
  1111.    section copperlist,data_c
  1112.  
  1113. copperlist:
  1114.  dc.w $2001,-2
  1115.  dc.w $180,$000,$182,$0a0,$184,$080
  1116.  dc.w $186,$00c,$188,$00a,$18a,$a0a
  1117.  dc.w $18c,$808,$18e,$00f
  1118.  dc.w $5e01,-2,$180,$05a
  1119.  dc.w $5f01,-2,$180,$07c
  1120.  dc.w $6001,-2,$180,$0af
  1121.  dc.w $6101,-2,$180,$05a
  1122.  dc.w $620f,-2,$96,$8100,$180,0
  1123. page:
  1124.  dc.w $e0,0,$e2,0,$e4,0,$e6,0,$e8,0,$ea,0
  1125.  dc.w $f601,-2,$96,$100,$180,$05a
  1126.  dc.w $f701,-2,$180,$0af
  1127.  dc.w $f801,-2,$180,$07c
  1128.  dc.w $f901,-2,$180,$05a
  1129.  dc.w $fa01,-2,$180,0
  1130.  dc.w -1,-2
  1131.